package com.example.seey2023.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.seey2023.entity.NcovData;
import com.example.seey2023.service.IndexService;
import com.example.seey2023.vo.DataView;
import com.example.seey2023.vo.NcovDataVo;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

@Controller
public class ChinaDataAdminController {

    @Autowired
    private IndexService indexService;

    // 跳转页面
    @RequestMapping("toChinaManager")
    public String toChinaManager() {
        return "admin/chinadatamanager";
    }

    /**
     * 带分页的查询方法listDataByPage
     * @return
     */
    @RequestMapping("/listDataByPage")
    @ResponseBody
    public DataView listDataByPage(NcovDataVo ncovDataVo) {
        // 1.创建分页的对象
        IPage<NcovData> page = new Page<>(ncovDataVo.getPage(), ncovDataVo.getLimit());
        // 2.创建模糊查询条件，创建MybatisPlus封装条件
        QueryWrapper<NcovData> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(!(ncovDataVo.getName() == null), "name", ncovDataVo.getName());
        // 3.确诊数量排序
        queryWrapper.orderByDesc("id");
        // 4.查询数据库
        indexService.page(page, queryWrapper);
        // 5.返回数据封装
        DataView dataView = new DataView(page.getTotal(), page.getRecords());
        return dataView;
    }

    /**
     * 根据ID删除数据
     *
     * @param id
     * @return
     */
    @RequestMapping("/china/deleteById")
    public DataView deleteById(Integer id) {
        indexService.removeById(id);
        DataView dataView = new DataView();
        dataView.setCode(200);
        dataView.setMsg("删除中国地图数据成功");
        return dataView;
    }


    /**
     * 新增或修改【ID】
     * id:ncovData 有ID修改，没ID就新增
     * update nocv data set name = "" where id = ?
     * insert into
     * @param ncovData
     * @return
     */
    @RequestMapping("/china/addOrUpdateChina")
    @ResponseBody
    public DataView addOrUpdateChina(NcovData ncovData) {
        boolean save = indexService.saveOrUpdate(ncovData);
        DataView dataView = new DataView();
        if (save) {
            dataView.setCode(200);
            dataView.setMsg("新增/编辑中国地图数据成功");
            return dataView;
        }
        dataView.setCode(100);
        dataView.setMsg("新增/编辑中国地图数据失败");
        return dataView;
    }

    /**
     * Excel的拖拽或者点击上传
     * 1.前台页面发送一个请求，上传文件MutilpartFile HTTP
     * 2.Controller，上传文件MutilpartFile 参数
     * 3.POI 解析文件，里面的数据一行一行全部解析
     * 4.每一条数据插入数据库
     */
    @RequestMapping("/excelImportChina")
    @ResponseBody
    public DataView excelImportChina(@RequestParam("file") MultipartFile file) throws IOException {
        DataView dataView = new DataView();
        // 1.文件不为空
        if (file.isEmpty()) {
            dataView.setMsg("文件为空，不能上传！");
        }

        // 2.POI获取Excel解析数据
        XSSFWorkbook wb = new XSSFWorkbook(file.getInputStream());
        XSSFSheet sheet = wb.getSheetAt(0);
        // 3.定义一个程序集合 接受 文件中的数据
        List<NcovData> list = new ArrayList<>();
        XSSFRow row = null;
        // 4.解析数据，装到集合里面
        for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
            // 4.1 定义实体
            NcovData ncovData = new NcovData();
            // 4.2 每一行的数据，放到实体类里面
            row = sheet.getRow(i);
            // 4.3 解析数据
            ncovData.setName(row.getCell(0).getStringCellValue());
            ncovData.setValue((int) row.getCell(1).getNumericCellValue());
            // 5.添加list集合
            list.add(ncovData);
        }
        // 6. 插入数据库
        indexService.saveBatch(list);
        dataView.setCode(200);
        dataView.setMsg("excel插入成功！");
        return dataView;
    }

    /**
     * 导出Excel数据 中国疫情数据
     * 1.查询数据库
     * 2.建立Excel对象，封装数据
     * 3.建立输出流，输出文件
     */
    @RequestMapping("/excelOutPortChina")
    @ResponseBody
    public void excelOutPortChina(HttpServletResponse response){
        // 1. 查询数据库【查询所有，符合条件的数据】
        List<NcovData> list = indexService.list();
        // 2.建立Excel对象，封装数据
        response.setCharacterEncoding("UTF-8");
        // 2.1 创建Excel对象
        XSSFWorkbook wb = new XSSFWorkbook();
        // 2.2 创建sheet对象
        XSSFSheet sheet = wb.createSheet("中国疫情数据sheet1");
        // 2.3 创建表头
        XSSFRow xssfRow = sheet.createRow(0);
        xssfRow.createCell(0).setCellValue("城市名称");
        xssfRow.createCell(1).setCellValue("确诊数量");
        // 3.遍历数据，封装Excel工作对象
        for (NcovData data : list) {
            XSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
            dataRow.createCell(0).setCellValue(data.getName());
            dataRow.createCell(1).setCellValue(data.getValue());
        }
        // 4. 建立输出流，输出浏览器文件
        OutputStream os = null;
        try {
            // 4.1设置Excel名字,输出类型编码
            response.setContentType("application/octet-stream;chartset=utf8");
            response.setHeader("Content-Disposition", "attachment;filename=" + new String("中国疫情数据表".getBytes(), "iso-8859-1") + ".xlsx");
            // 4.2 输出文件
            os = response.getOutputStream();
            wb.write(os);
            os.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    // 5. 关闭输出流
                    os.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
